package com.campus.help.service;

import com.campus.help.entity.Student;

/**
 * 授权登录服务接口
 *
 * @author campus-help
 * @since 2025-09-18
 */
public interface AuthService {

    /**
     * 微信小程序登录
     *
     * @param code 微信登录凭证
     * @return 登录结果，包含token和学生信息
     */
    LoginResult wechatLogin(String code);

    /**
     * 更新用户信息（使用加密数据）
     *
     * @param studentId 学生ID
     * @param encryptedData 加密数据
     * @param sessionKey 会话密钥
     * @param iv 初始向量
     * @param schoolId 学校ID
     * @param phone 手机号
     * @param qq QQ号
     * @param wechat 微信号
     * @param email 邮箱
     * @return 更新后的学生信息
     */
    Student updateUserInfo(Long studentId, String encryptedData, String sessionKey, String iv, 
                          Long schoolId, String phone, String qq, String wechat, String email);

    /**
     * 简化更新用户信息（适配新版微信）
     *
     * @param studentId 学生ID
     * @param nickname 昵称
     * @param avatarUrl 头像URL
     * @param schoolId 学校ID
     * @param phone 手机号
     * @param qq QQ号
     * @param wechat 微信号
     * @param email 邮箱
     * @return 更新后的学生信息
     */
    Student updateUserInfoSimple(Long studentId, String nickname, String avatarUrl,
                               Long schoolId, String phone, String qq, String wechat, String email);

    /**
     * 更新用户学校
     *
     * @param studentId 学生ID
     * @param schoolId 学校ID
     * @return 更新后的学生信息
     */
    Student updateUserSchool(Long studentId, Long schoolId);

    /**
     * 根据openid获取学生信息
     *
     * @param openid 微信openid
     * @return 学生信息
     */
    Student getStudentByOpenid(String openid);

    /**
     * 生成JWT token
     *
     * @param student 学生信息
     * @return JWT token
     */
    String generateToken(Student student);

    /**
     * 验证token
     *
     * @param token JWT token
     * @return 学生信息
     */
    Student validateToken(String token);

    /**
     * 获取用户总数
     *
     * @return 用户总数
     */
    Long getTotalUsersCount();

    /**
     * 登录结果类
     */
    class LoginResult {
        private String token;
        private Student student;
        private boolean isNewUser;
        private String sessionKey;

        public LoginResult(String token, Student student, boolean isNewUser) {
            this.token = token;
            this.student = student;
            this.isNewUser = isNewUser;
        }

        public LoginResult(String token, Student student, boolean isNewUser, String sessionKey) {
            this.token = token;
            this.student = student;
            this.isNewUser = isNewUser;
            this.sessionKey = sessionKey;
        }

        // getter和setter方法
        public String getToken() { return token; }
        public void setToken(String token) { this.token = token; }
        public Student getStudent() { return student; }
        public void setStudent(Student student) { this.student = student; }
        public boolean isNewUser() { return isNewUser; }
        public void setNewUser(boolean newUser) { isNewUser = newUser; }
        public String getSessionKey() { return sessionKey; }
        public void setSessionKey(String sessionKey) { this.sessionKey = sessionKey; }
    }
}
